var async = {}
async.sequence = function(arr) {
    var funcs = arr.map(function(item) {
        return item
    })
    var i = 0
    var cb = function(final, err, value) {
        i++
        if (i === funcs.length) {
            final(null, value)
        } else {
            funcs[i](cb.bind(null, final), value)
        }
    }
    return function(final) {
        funcs[i](cb.bind(null, final))
    }
}
async.parallel = function(arr) {
    var funcs = arr.map(function(item) {
        return item
    })
    var result = new Array(funcs.length)
    var i = 0
    var cb = function(final, index, err, value) {
        result[index] = value
        i++
        if (i === funcs.length) {
            final(null, result)
        }

    }
    return function(final) {
        for (var j = 0; j < funcs.length; j++) {
            (function(j) {
                funcs[j](cb.bind(null, final, j))
            })(j)
        }
    }
}
async.race = function(arr) {
    var funcs = arr.map(function(item) {
        return item
    })
    var result = new Array(funcs.length)
    var i = 0
    var cb = function(final, err, value) {
        if (i === 0) {
            final(null, value)
        }
        i++
    }
    return function(final) {
        for (var j = 0; j < funcs.length; j++) {
            funcs[j](cb.bind(null, final))
        }
    }
}
exports = module.exports = async